package com.sud.config.util;


import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.SecureRandom;
import java.util.Random;

/**
 * 功能：AES模式加密
 * 作者：Zhang_XinGang
 * 时间：2019/11/4 17:29
 */
public class AESUtil {
    private static char[] codeSequence = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
            'k', 'l', 'm', 'n', 'o','p', 'q', 'r', 's', 't', 'u', 'v', 'w',
            'x', 'y', 'z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            '!','@','#','$','%','^','&','*','-','+','_','=' };


    public static void main(String[] a){
        try {

            String key = getRandom(128);
            System.out.println("key="+key);
            //key=l@i0$gw89@ew3&7-jt&-2epz!isxv8l3
            //key="a5%u54l4-iyn7l406ex@6o4zb9_r+_iu_qq-g7ffo=1qpshxhq#ly1kz9icl-mf&&=ls38y42mw81ao$w*sa-^02khz@stlfzpnykfj-kun!j^hnrjpy507w1rf8@g3x4v&8a+*9**u33bxn357xf9t*z+lxy15#oeg#96dh!!=a-m7l46mqszfq&3q%=@wv+6vgybu+j!r6^o02ybujk41%qfgy4zwi4=*ibud%+oasx1ft4#+ucixx50sn0zr!";
            //key = "!@#$%^&*()_+|:',./<>?";
            /*String string = "{\"dataList\":{\"dep_id\":\"795efbe913564c5baac350eb141a2f4b\",\"exist_date\":\"2019-05-07\",\"fddbrsfzh\":\"610103197502040011\",\"id\":\"c2a733102616480e9cb401a8cb00e71e\",\"m_010101\":2005768051,\"shield_sate\":0,\"shield_table\":\"zxqz_xyangsg0401645_0245\",\"jdjg\":\"咸阳市秦都区人力资源和社会保障局\",\"lrqx\":\"2020-04-09\",\"lryy\":\"该单位在中国咸阳西部国际商贸城项目因拖欠劳务分包企业农民工工资违法行为引发群体性上访事件。\",\"publish_state\":0,\"xy010101\":\"中铁湘建工程集团第六工程有限公司\",\"timely_date\":-1,\"dep_name\":\"陕西省咸阳市秦都区人力资源和社会保障局\",\"data_state\":2,\"lrdate\":\"2019-04-10\",\"ysxx\":\"{'主体名称':'中铁湘建工程集团第六工程有限公司','统一社会信用代码':'91610103MA6UPU8983','登记证号':'null','法定代表人（负责人）姓名':'严军','法定代表人（负责人）证件号码':'610103197502040011','失信领域':'劳动保障黑名单','列入日期':'2019-04-10','列入原因':'该单位在中国咸阳西部国际商贸城项目因拖欠劳务分包企业农民工工资违法行为引发群体性上访事件。','列入决定机关':'咸阳市秦都区人力资源和社会保障局','列出日期':'null','列出原因':'null','失效日期':'2020-04-09'}\",\"day_id\":20190506,\"zttype\":\"1\",\"repaired_state\":0,\"row_id\":1,\"create_date\":\"2019-05-06\",\"dep_class_id\":\"537483ff5cad4c739e81c3d2107b104a\",\"user_id\":\"27f2ee6a97fd4e0eb6ae6591d7f3063e\",\"mondify_date\":\"2019-05-06 04:18:45\",\"is_mate\":1,\"lrwh\":\"咸秦人社监告字[2019]第018号\",\"effective_date\":\"2020-04-09\",\"sub_type\":1,\"xy010133\":\"91610103MA6UPU8983\",\"sxly_label\":\"劳动保障黑名单\",\"xy010105\":\"严军\",\"sxly\":\"20\"},\"columns\":[{\"zh_name\":\"法人或其他组织名称\",\"en_name\":\"xy010101\"},{\"zh_name\":\"统一社会信用代码\",\"en_name\":\"xy010133\"},{\"zh_name\":\"法定代表人姓名\",\"en_name\":\"xy010105\"},{\"zh_name\":\"法定代表人身份证号码\",\"en_name\":\"fddbrsfzh\"},{\"zh_name\":\"失信领域\",\"en_name\":\"sxly_label\"},{\"zh_name\":\"列入文号\",\"en_name\":\"lrwh\"},{\"zh_name\":\"列入事由\",\"en_name\":\"lryy\"},{\"zh_name\":\"列入日期\",\"en_name\":\"lrdate\"},{\"zh_name\":\"认定机关\",\"en_name\":\"jdjg\"},{\"zh_name\":\"公布期限\",\"en_name\":\"lrqx\"},{\"zh_name\":\"移出日期\",\"en_name\":\"ycdate\"},{\"zh_name\":\"信息提供部门 \",\"en_name\":\"dep_name\"},{\"zh_name\":\"信息报送日期\",\"en_name\":\"create_date\"},{\"zh_name\":\"最后一次修改日期\",\"en_name\":\"mondify_date\"}]}";

            String str = encryption(string,key);
            System.out.println(str);
            System.out.println(str.length());
            str = decryption(str,key);
            System.out.println(str);*/
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 获取随机密钥
     * @param length
     * @return
     */
    public static String getRandom(int length){
        String randomStr = null;
        Random random = new Random();
        StringBuffer randomCode = new StringBuffer();
        for (int i = 0; i < length; i++) {
            // 得到随机产生的验证码数字。
            String code = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
            // 将产生的四个随机数组合在一起。
            randomCode.append(code);
        }
        randomStr = randomCode.toString();
        return randomStr;
    }

    /**
     * 生成密匙
     * @param secretKeyStr
     * @return
     */
    public static Key createKey(String secretKeyStr) {
        try {
            // 生成key
            KeyGenerator keyGenerator;
            //构造密钥生成器，指定为AES算法,不区分大小写
            keyGenerator = KeyGenerator.getInstance("AES");
            //生成一个128位的随机源,根据传入的字节数组
            keyGenerator.init(128,new SecureRandom(secretKeyStr.getBytes("UTF-8")));
            //产生原始对称密钥
            SecretKey secretKey = keyGenerator.generateKey();
            //获得原始对称密钥的字节数组
            byte[] keyBytes = secretKey.getEncoded();
            // key转换,根据字节数组生成AES密钥
            Key key = new SecretKeySpec(keyBytes, "AES");
            return key;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    /**
     * 加密
     * @param context 明文
     * @param secretKey 密匙
     * @return
     */
    public static String encryption(String context,String secretKey) {
        try {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(cipher.ENCRYPT_MODE, createKey(secretKey));
            //将加密并编码后的内容解码成字节数组
            byte[] result = cipher.doFinal(context.getBytes());
            return Base64.encodeBase64String(result);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 解密
     * @param secretData 密文
     * @param secretKey 密匙
     * @return
     */
    public static String decryption(String secretData, String secretKey) {
        Cipher cipher;
        try {
            cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            //初始化密码器，第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作，第二个参数为使用的KEY
            cipher.init(Cipher.DECRYPT_MODE, createKey(secretKey));
            byte[] result = cipher.doFinal(Base64.decodeBase64(secretData));
            return new String(result,"UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
